(function(){

  const g={};let h=false;

  // dom 选择器 
  function choice(b){
    h=b; //h=btoa(b);
    if(h in g === false){
      if(typeof b==='string'){
        g[h]=dGet(document,b);g[h]['limit']=[];
        for(let l=0;l<g[h].length;l++){
          g[h]['limit'][l]=l;
        }
      }
    }
    return false;
  }
  
  // 主Dom下挑选元素
  function orderChoice(gA,bA,i){
    if(typeof bA==='object' && bA!==null){
      let gB={},gC=[],gD=[],gE=[];iA=0;
      for(let l=0;l<bA.length;l++){
        for(let al=0;al<gA.length;al++){
          gB=dGet(gA[al],bA[l]);
          if(i===false){
            for(let bl=0;bl<gB.length;bl++){
              iA=gC.length;gC[iA]=gB[bl];gE[iA]=iA;
            }
          }else{
            for(let il=0;il<i[bA[l]].length;il++){
              iA=gC.length;gC[iA]=gB[i[bA[l]][il]-1];gE[iA]=iA;
            }
          }
        }
        gA=gC;gD=gE;gC=[];gE=[];iA=0;
      }
      g[h]=gA;g[h]['limit']=gD;gB=false;gD=false;
    }
    return false;
  }

  // 获取 DOM 
  function dGet(d,b){
    switch(b.charAt(0)){
      case '#':return [d.getElementById(b.substring(1)) || false]; break;
      case '.':return d.getElementsByClassName(b.substring(1)); break;
      case ':':return d.getElementsByName(b.substring(1)); break;
      default: return d.getElementsByTagName(b);
    }
  }

  a=function(b){
    choice(b);
    //console.log(g);
    return c={
      // DOM 循环
      'd':function(f){
        let r=false;
        for(let l=0;l<g[h]['limit'].length;l++){
          r=f(g[h][g[h]['limit'][l]]);
        }
        return r;
      },
      // 联查模式
      'and':function(bA){
        h=btoa(bA);
        if(h in g === false){orderChoice(g[b],bA,false);}
        return c;
      },
      // 标签指定勾选查找
      'order':function(bA){
        h=btoa(bA);// 不存在有一样的ID
        orderChoice(g[b],Object.keys(bA),bA);
        return c;
      },
      // 索引分配
      'limit':function(v){
        g[h]['limit']=[];
        for(let l=0;l<v.length;l++){
          g[h]['limit'][l]=v[l]-1;
        }
        return c;
      },
      // 处理HTML标签内容
      'html':function(v){
        if(typeof v==='undefined'){
          return c.d(function(i){return i.innerHTML;});
        }else{
          c.d(function(i){i.innerHTML=v;return true;});return c;
        }
      },
      // 处理表单内容
      'text':function(v){
        if(typeof v==='undefined'){
          return c.d(function(i){return i.value;});
        }else{
          c.d(function(i){i.value=v;return true;});return c;
        }
      },
       // 处理标签属性
      'attr':function(u,v){
        if(typeof v==='undefined'){
          return c.d(function(i){return i.getAttribute(u);});
        }else{
          c.d(function(i){i.removeAttribute(u);i.setAttribute(u,v);return true;});return c;
        }
      },
      // CSS 处理
      'css':function(u,v){
        if(u==='style'){
          c.d(function(i){i.style.cssText=v;});
        }else{
          c.d(function(i){i.style[u]=v;});
        }
        return c;
      },
      // 类名处理
      'class':function(v){
        return c.d(function(i){i.className=v;return true;});
      },
      // 统计DOM总数
      'count':function(){
        return g[h].length;
      },
      // 返回指定的DOM数组
      'dom':function(v){
        if(typeof v==='undefined'){return g[h];}else{return g[h][v-1];}
      },
      // 扩展 for
      'fo':function(f){c.d(function(i){f(i);});},
      // 扩展函数
      'fu':function(f){f(g[h]);},
      // 鼠标事件
      'on':function(u,f){
        c.d(function(i){
          i.addEventListener(u,function(ev){
            f(i,g[h]);ev.stopPropagation(); //阻止事件冒泡
          },false);
        });
      },
      // 事件委托
      'en':function(u,f){
        g[h][u['limit']-1].addEventListener(u['on'],function(ev){
          var ev=ev||window.event; //兼容性处理
          let target=ev.target||ev.srcElement;
          if(target.nodeName===u['tag']){f(target);}
        },true);
      },
      // 标签添加
      'tagIn':function(v,f){
        // 等待解决的问题，如果频繁的添加和删除会报错 ，百度appendChild 频繁操作会报错会有解决方案
        let t=document.createElement(v['tag']); // 创建新标签
        if(typeof f!='undefined'){f(t);}
        if(v['sort']){
          let tA=dGet(g[h][v['limit']-1],v['tag']);
          if(v['sort'] > tA.length){
            g[h][v['limit']-1].appendChild(t); // 输入的值大于标签数就从后面添加
          }else{
            g[h][v['limit']-1].insertBefore(t,tA[v['sort']-1]); // 指定位置添加
          } 
        }else{
          g[h][v['limit']-1].appendChild(t); // 把标签写入指定父元素，而且从后面添加
        }
        t=false;tA=false;return true;
      },
      // 标签删除
      'tagDe':function(v){
        let tA=dGet(g[h][v['limit']-1],v['tag']);
        for (let l=0;l<v['sort'].length;l++){
          g[h][v['limit']-1].removeChild(tA[v['sort'][l]-1]);
        }
        tA=false;return true;
      },
      // 标签排序
      'tagSo':function(v){
        let tA=dGet(g[h][v['limit']-1],v['tag']);
        g[h][v['limit']-1].insertBefore(tA[v['sort'][0]-1],tA[v['sort'][1]-1]); // 元素移动，第一个值是要移动的元素，第二个值是把移动的元素移动到它前面的意思
        tA=false;return true;
      },
      // 元素尺寸以及位置
      'size':function(v){
        return c.d(function(i){
          switch(v){
            case'width':return i.offsetWidth;break; // 包含边框 border，内边距 padding ，不含外边距 margin
            case'height':return i.offsetHeight;break;
            case'left':return i.offsetLeft;break;
            case'top':return i.offsetTop;break;
          }
        });
      },
      'version':'1.0'
    };
  }

})();

/*
大写字母：A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、V、W、X、Y、Z。
小写字母：a、b、c、d、e、f、g、h、i、j、k、l、m、n、o、p、q、r、s、t、u、v、w、x、y、z。


a 外部主函数
b 外部主函数传入参数
c 内部主对象
d DOM 循环
e 
f 指定内部函数


g 存放DOM对象获取
h 对象键名
i 对象单数

l for 循环指定变量

r 主对象的返回变量
v 内部主对象的传入参数

*/